class GCounter {
  /**
   *
   * @param {*} id 客户端id，也就是副本id
   */
  constructor(id) {
    this.id = id;
    this.state = { [id]: 0 }; // 维护每一个副本对应的计数值 {A: 1, B: 2, C: 3}
  }

  /**
   * 获取当前的状态值
   */
  getState() {
    return this.state;
  }

  /**
   * 计数器自增
   */
  increment() {
    this.state[this.id] += 1; // 找到当前id的计数器，然后自增1
  }

  /**
   * 合并其他副本的状态
   * @param {*} otherState 其他副本的状态 {A: 1, B: 2, C: 3}
   */
  merge(otherState) {
    // [[A, 1], [B, 2], [C, 3]]
    // key 对应的是每个副本的id，val对应的是每个副本的计数值
    for (const [key, val] of Object.entries(otherState)) {
      // 每一对取最大值
      // this.state[key] || 0 代表当前副本的计数值，如果没有则默认为0
      // val 代表其他副本的计数值
      this.state[key] = Math.max(this.state[key] || 0, val);
    }
  }

  value() {
    // 将每一个副本的计数值进行求和
    return Object.values(this.state).reduce((sum, val) => sum + val, 0);
  }
}

module.exports = GCounter;
